package com.siashan.toolkit.lock4j.annotation;

import com.siashan.toolkit.lock4j.key.AbstractLockKeyBuilder;
import com.siashan.toolkit.lock4j.key.DefaultLockKeyBuilder;
import com.siashan.toolkit.lock4j.strategy.DefaultLockFailStrategy;
import com.siashan.toolkit.lock4j.strategy.LockFailStrategy;
import com.siashan.toolkit.lock4j.strategy.LockStrategy;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 防重复提交注解
 *
 * @author siashan
 * @date 2024/4/7
 */
@Target(value = {ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface NoRepeat {

    /**
     * @return KEY 默认包名+方法名
     */
    String[] keys() default "";

    /**
     * @return DEFKEY 自定义的key
     */
    String lockKey() default "";

    /**
     * @return  获取锁失败提示
     */
    String lockFailMsg() default "请勿重复提交!";

    /**
     * @return 过期时间 单位：毫秒
     * <pre>
     *     过期时间一定是要长于业务的执行时间. 未设置则为默认时间3秒
     * </pre>
     */
    long expire() default 3000;

    /**
     * @return 获取锁超时时间 单位：毫秒
     * <pre>
     *     结合业务,建议该时间不宜设置过长,特别在并发高的情况下. 未设置则为默认时间3秒
     * </pre>
     */
    long acquireTimeout() default 3000;


    /**
     * 获取锁失败处理逻辑
     *
     *
     * @return
     */
    LockStrategy lockStrategy() default LockStrategy.FAIL_FAST;

    /**
     * @return 锁名称构建类
     */
    Class<? extends AbstractLockKeyBuilder> keyBuilder() default DefaultLockKeyBuilder.class;

    /**
     * @return 锁失败策略类
     */
    Class<? extends LockFailStrategy> failStrategy() default DefaultLockFailStrategy.class;

}
